#include <iostream>
#include <string>
#include "Figura2D.h"
#include "ExcepcionSVG.h"
using namespace std;

Figura2D::Figura2D (Coordenada porigen, int g, Color f, Color l):origen(porigen),colorFondo(f),colorLinea(l)
{
	if(g>=0)
	grosorLinea = g;
	else throw ExcepcionValorNoValido(g,"el grosor debe ser posotivo o cero");
	agrupada = false;
	
	if(f<17)
	{
		colorFondo=f;
	}
	else throw ExcepcionValorNoValido(f,"no esta dentro del rango de color");
}

Figura2D::Figura2D (const Figura2D & f):colorFondo(f.colorFondo),colorLinea(f.colorLinea)
{
	origen=f.origen;
	grosorLinea=f.grosorLinea;
}


Figura2D& 
Figura2D::operator=( const Figura2D & f){

	if(this != &f)
	{
		origen = f.origen;
		colorFondo = f.colorFondo;
		colorLinea = f.colorLinea;
		grosorLinea = f.grosorLinea;	
	}
	return *this;

}

Coordenada
Figura2D::mover (const Coordenada& porigen)
{
	Coordenada aux;
	aux = origen;
	origen = porigen;
	return aux;
}

void
Figura2D::pintar(ostream & os) const
{
	os<< "fill=\"" << grosorLinea << "\" stroke=\"" << color[colorLinea] << "\" stroke-width=\"" << color[colorFondo]<< "\"";
}

ostream& 
operator<<(ostream& os, const Figura2D& fig)
{
	fig.pintar(os);
	return os;
}


void 
Figura2D::leeEntrada(istream & is)
{
	int fondo, linea;
	int cx, cy ;
	float grosor;
	
	is >> cx>>cy >> grosor >> fondo >> linea;
	try
	{
		Coordenada nueva(cx,cy);
		this->mover(nueva);
	}catch(ExcepcionCoordenadaErronea &ex){cerr<<ex.what();}
	
	this->setGrosorLinea(grosor);
	
	if(fondo<17)
	{
	this->setFondo((Color)fondo);
	}else throw ExcepcionValorNoValido(fondo,"fuera del rango de color");
	
	if(linea<17)
	{
	this->setLinea((Color)linea);
	}else throw ExcepcionValorNoValido(linea,"fuera del rango de color");
}

bool 
Figura2D::puedoPintarme()const
{
	return !(agrupada);//si agrupada es falso, se puede pintar individualmente, devuelve true
}

void 
Figura2D::setAgrupada(bool a)
{
	agrupada =  a;
}

void
Figura2D::ocultar(bool ocult)
{
	oculta=ocult;
}

bool
Figura2D::isOculto()const
{
	return oculta;
}

Figura2D::~Figura2D(){}

Figura2D*
Figura2D::clonar()
{
}

Figura2D*
Figura2D::duplicar(const Coordenada&){}

void
Figura2D::escalar(float){}

bool 
Figura2D::esAgrupada()const
{
	return agrupada;
}

